package com.dys.interceptor;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import java.util.Map;

/**
 * @className: com.dys.interceptor.MyInterceptor2
 * @description: springmvc拦截器执行
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/10/31 22:44
 */
public class MyInterceptor2 implements HandlerInterceptor {
    /**
     * 前置拦截：进入控制单元方法之前执行
     *
     * @param request  拦截的请求的request对象
     * @param response 拦截的请求的response对象
     * @param handler  封存了单元方法对象的HandleMethod对象
     * @return true: 放行, false: 拦截
     * @throws Exception 异常对象
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在请求到达Handle之前工作的->在springmvc执行流程的处理器适配器位置执行
        System.out.println("自定义拦截器 preHandle()2方法执行......");
        // 设置请求和响应的乱码
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        // 应用场景:
        // 1.判断是否登录
        // User user = (User) request.getSession().getAttribute("user");
        // if (user == null) {
        //     response.sendRedirect("/login");
        //     return false;
        // }
        // 2.用户权限控制
        // 返回true: 代表放行,可以继续到达Handle
        return true;
    }

    /**
     * 后置拦截：在进行数据处理和做出响应之间进行这个方法的调用
     * 在业务处理器处理完请求后，但是 DispatcherServlet 向客户端返回响应前被调用，在该方法中对用户请求 request域数据进行处理
     *
     * @param request      拦截的请求的request对象
     * @param response     拦截的请求的response对象
     * @param handler      封存了单元方法对象的HandleMethod对象
     * @param modelAndView 存了单元方法的返回值资源路径和请求转到的Map数据
     * @throws Exception 异常对象
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // handler 处理单元返回ModelAndView 时候进行 拦截
        System.out.println("handler处理单元返回ModelAndView时进行拦截：postHandle2()方法执行......");
        // 控制数据
        Map<String, Object> map = modelAndView.getModel();
        String msg = (String) map.get("msg");
        String newMsg = msg.replaceAll("脏话", "**");
        map.put("msg", newMsg);
        // 控制视图
        modelAndView.setViewName("/viewName.jsp");
    }

    /**
     * 进行页面渲染的时候执行,按拦截器定义逆序调用,无论controller是否出现异常,都会执行的方法
     * 在DispatcherServlet 完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。
     *
     * @param request  拦截的请求的request对象
     * @param response 拦截的请求的response对象
     * @param handler  封存了单元方法对象的HandleMethod对象
     * @param ex       存储了责任链的异常信息
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 页面渲染完毕,但是还没有给浏览器响应数据的时候
        System.out.println("页面渲染完毕,但是还没有给浏览器响应数据时执行：afterCompletion2()方法......");
    }
}
